[12] 函式 Function


Posted by bessyhuang on 2023-07-15

簡介

有些程式語言將函式稱為「 方法 」、「 程序 」或「 副程式 」。

函式的作用?

將一段『 具有某種功能 』或『 重複使用的敘述 』寫成獨立的程式單元,然後給予名稱,供後續呼叫使用,以『 簡化程式、提高可讀性 』。

為何需要學函式?

將程式碼包裝在一個區塊中,方便隨時呼叫使用!

函式的優缺點

  • 優點
    • 可重複使用,程式會變得比較精簡。
    • 可讀性提高,容易偵錯、修改與維護。
  • 缺點
    • 多了一道呼叫的手續,使程式的執行速度減慢。

Python 常見函式分為四種

  1. 內建函式
  2. 自訂函式
  3. 匿名函式 lambda
  4. 遞迴函式 (Recursive function)

全域變數 與 區域變數

💡 指的是 變數的有效生存範圍。

全域變數 (Global Variable)

定義於 函式區塊外 的變數,可作用於整份 Python Script 的範圍

#全域變數
i = 10
def f():
    print(i)

f()           #10
print(i)      #10

區域變數 (Local Variable)

定義於 函式區塊內 的變數,僅能作用於函式區塊內

def a1():
    #區域變數,無法傳到外面
    x = 1
    print(x)

print(x)       #NameError: name 'x' is not defined

內建函式

  • Python 針對常見的用途所提供,但不一定能夠滿足所有需求。
  • e.g. print()input()eval()type()int()join()

自訂函式

  • 若要客製化一些功能,就要自行定義函式。
  • 語法
    • 定義函式
        def functionName([parameters]):
            """
            通常函式的註解會寫在這裡!
            """
            statement
            [return value]
      
    • 呼叫函式
        functionName([parameters])
      

規範

  • 定義(建立)函式 必須置於呼叫(使用)函式之前
  • 函式的名稱「 不能重複 」!
  • 函式的 parameters,可以為 0 個、1 個或多個。
    • 若沒有 parameters, ( ) 仍須保留。
    • 若有多個 parameters,以 , 逗號隔開。parameters 個數及順序均不能弄錯
  • 函式 return 的 value,可以為 0 個、1 個或多個。
    • 沒有 return value,即 此函式 無回傳值 的意思,但其實 隱含了回傳一個 None, 可省略不寫。
    • 若有多個 return value,以 , 逗號隔開。return value 個數及順序均不能弄錯

補充

  • 如果想看到函式的註解,可以使用 print(functionName.__doc__)
  • 假如想暫時空著且不讓執行時出錯,可使用 pass (佔位語句,表示不做任何事,是為了保持程式碼結構的完整性)。

      def functionName([parameters]):
          pass
    
      functionName([parameters])
    

範例:基本版

#定義函式:定義一個印出 Hello 的程式
def sayhello():
    """
    通常函式的註解會寫在這裡!
    """
    print("Hello")

#呼叫函式:呼叫上方定義的函式
sayhello()

#印出函式內的註解
print(sayhello.__doc__)

範例:0 個、1 個或多個函式 parameters

  • parameter:用來傳遞資料給函式。
  • 沒有回傳值 = 沒有 return value,即 此函式 無回傳值 的意思,但其實 隱含了回傳一個 None, 可省略不寫。
  • 若沒有 parameters, ( ) 仍須保留。

      #定義函式 (沒有 parameters, 沒有回傳值)
      def sayhello():
          print("Hello")
    
      #呼叫函式
      sayhello()
    
  • 若有多個 parameters,以 , 逗號隔開。parameters 個數及順序均不能弄錯。

      #定義函式 (有 1 個 parameters, 沒有回傳值)
      def say(msg):
          print(msg)
    
      #呼叫函式
      say("Hello Python")
      say("Hi ~ ")
    
      #定義函式 (有 N 個 parameters, 沒有回傳值)
      def add(n1, n2):
          result = n1 + n2
          print(result)
    
      #呼叫函式
      add(3, 4)
      add(8, 9)
    

範例:0 個、1 個或多個函式 return value

  • return:離開函式,返回呼叫函式的地方。
  • 基本上,Python 的函式都有回傳值。當我們用一個變數來接無回傳值函式的結果時,從執行結果可以看到 Python 隱含回傳了一個 None。
  • 若有多個 return value,以 , 逗號隔開。return value 個數及順序均不能弄錯。

      #定義函式 (有 1 個 回傳值)
      def checkscore(score):
          if score < 0 or score > 100:
              return "分數超過範圍!"
          elif score >= 60:
              return "及格!"
          else:
              return "不及格!"
    
      s = eval(input("請輸入分數:"))
    
      #呼叫函式
      print(checkscore(s))
    
      #定義函式 (有 N 個 回傳值)
      def divmod(x, y):
          div = x // y
          mod = x % y
          return div, mod
    
      #呼叫函式
      a, b = divmod(100, 7)
      print("100除以7的商數為", a, "餘數為", b)
      c, d = divmod(200, 13)
      print("200除以13的商數為", c, "餘數為", d)
    

匿名函式 lambda

lambda arg1, arg2, … : *expression*
lambda 參數 : 運算式
  • 用來建立小的 匿名函式 (沒有名稱的函式)。
  • 注意!lambda 運算式 不能有區塊,所以只能處理簡單的工作
    • 對於 比較複雜的工作,還是要 使用 def 定義函式 才行。
  • lambda 運算式會產生一個 函式物件
    • arg1, arg2, … 相當於函式定義的參數。
    • expression 相當於函式定義的主體 (statements)。

範例

  1. 作為簡單的運算式

     add = lambda x, y : x + y
    
     print(add(1, 2))              #3
     print(add("abc", "de"))       #abcde
    
  2. 當作鍵值索引

     pairs = [(1, "one"), (2, "two"), (3, "three"), (4, "four")]
    
     # 根據 pair[1] 來排序:"one", "two", "three", "four"
     pairs.sort(key=lambda pair: pair[1])                    # 方法一
     new_pairs = sorted(pairs, key=lambda pair: pair[1])     # 方法二
    
     # Output: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
    

遞迴函式 (Recursive function)

  • 遞迴函式:可以不斷地自己呼叫自己本身的函式。
  • 優點:邏輯性、可讀性及彈性均比迴圈來得好。

      n = eval(input("n = "))
    
      def factorial(n):
          if n == 0:
              return 1
          elif n > 0:
              return n * factorial(n - 1)
          else:
              return "錯誤輸入!"
    
      print(n, "! = ", factorial(n))
    
      💡 遞迴函式通常可以被 for 或 while 迴圈取代。
    
      n = eval(input("n = "))
       
      result = 1
      for i in range(1, n + 1):
          result = result * i
    
      print(n, "! = ", result)
    

References

  1. Variable Scope in Python
  2. 函式 function
  3. 補充教材:模組(Module)& 套件/封包(Package)
  4. 補充教材:函式 Function

#Python #function







Related Posts

在 Vue 3 中使用 Tailwind CSS

在 Vue 3 中使用 Tailwind CSS

What Type of Laser Engraving Machine Should be Used for Stainless Steel Engraving?

What Type of Laser Engraving Machine Should be Used for Stainless Steel Engraving?

【THM Walkthrough】Exploiting Active Directory (1)

【THM Walkthrough】Exploiting Active Directory (1)


Comments